package reflex.learning01;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @program JavaBase
 * @description:
 * @author: zhanglu
 * @create: 2019-06-07 10:22:00
 */
public class TestReflection {

    /**
     * 1、使用反射创建Person类的对象------反射创建对象
     * 2、可以调用运行时类的指定属性和方法------
     *
     * Java.lang.Class类，是反射的源头，每一个加载进JVM的类都
     * 对应一个Class实例
     * Java.lang.reflect:Field/Method/Constructor/Type...
     */
    @Test
    public void test01() throws Exception{
        Class<Person> clazz = Person.class;
        //创建实例
        Person p = clazz.newInstance();
        System.out.println(p);

        //指定属性
        Field f1 = clazz.getDeclaredField("name");
        //访问私有属性
        f1.setAccessible(true);
        f1.set(p, "zhangsan");

        Field f2 = clazz.getDeclaredField("age");
        f2.setAccessible(true);
        f2.set(p, 22);
        System.out.println(p);

        //调用指定方法
        Method m = clazz.getMethod("show");
        m.invoke(p);

        Method m1 = clazz.getDeclaredMethod("show", String.class);
        m1.setAccessible(true);
        m1.invoke(p, "张三");
    }

    /**
     * 测试代理
     */
    @Test
    public void test02(){
        ProxyFactory pf = new ProxyFactory();
        pf.productCloth();
    }

    @Test
    public void test03() throws Exception{
        Dao<Person> dao = new Dao<>();
        Person p = dao.get();
        Class clazz = p.getClass();
        p = (Person) clazz.newInstance();
        System.out.println(p);

        PersonDao pd = new PersonDao();
        pd.get();
        pd.getClass();
    }

}
